package jp.seraph.jsade.perceptor;

import jp.seraph.jsade.util.GeometoryUtil;

import org.apache.commons.math.geometry.Vector3D;

/**
 * Seeパーセプタによって受信する，エージェントの視覚情報
 */
public class SeeObject {
    public SeeObject(SeeObjectType aType, String aTeamName, int aID, double aDistance, double aHorizontalAngle, double aLatitudalAngle){
        mType = aType;

        if(mType == SeeObjectType.PLAYER){
            mTeamName = aTeamName;
            mID = aID;
        }else{
            mTeamName = "";
            mID = -1;
        }

        mDistance = aDistance;
        mHorizontalAngle = aHorizontalAngle;
        mLatitudalAngle = aLatitudalAngle;

        double tRadHorizontal = GeometoryUtil.degreeToRad(aHorizontalAngle);
        double tRadLatitudal = GeometoryUtil.degreeToRad(aLatitudalAngle);
        double tX = aDistance * Math.cos(tRadLatitudal) * Math.cos(tRadHorizontal);
        double tY = aDistance * Math.cos(tRadLatitudal) * Math.sin(tRadHorizontal);
        double tZ = aDistance * Math.sin(tRadLatitudal);
        mVelctor = new Vector3D(tX, tY, tZ);
    }

    public SeeObject(SeeObjectType aType, double aDistance, double aHorizontalAngle, double aLatitudalAngle){
        this(aType, "", -1, aDistance, aHorizontalAngle, aLatitudalAngle);
    }

    private SeeObjectType mType;
    private String mTeamName;
    private int mID;
    private double mDistance;
    private double mHorizontalAngle;
    private double mLatitudalAngle;
    private Vector3D mVelctor;

    /**
     * このSeeObjectが表す物の種類を取得する。
     *
     * @return
     */
    public SeeObjectType getType(){
        return mType;
    }

    /**
     * getType()がSeeObjectType.PLAYERである場合にはこのオブジェクトの所属チーム名を返す。
     * それ以外の場合空文字列を返す。
     * @return
     */
    public String getTeamName(){
        return mTeamName;
    }

    /**
     * getType()がSeeObjectType.PLAYERである場合には、このオブジェクトのIDを返す。
     * それ以外場合-1を返す。
     * @return
     */
    public int getID(){
        return mID;
    }

    /**
     * 主観とこのオブジェクトの距離を返す。
     * @return
     */
    public double getDistance(){
        return mDistance;
    }

    /**
     * 主観とこのオブジェクトの相対水平方向角度[°]を返す。
     * 前方が0°　左回転方向が正である。
     * @return
     */
    public double getHorizontalAngle(){
        return mHorizontalAngle;
    }

    /**
     * 主観とこのオブジェクトの相対垂直角度[°]を返す。
     * 水平面方向が0° 上方が正である。
     * @return
     */
    public double getLatitudalAngle(){
        return mLatitudalAngle;
    }

    /**
     * 主観からこのオブジェクトへのベクトルを返します。
     * x方向が前方
     * y方向が左方
     * z方向が上方
     * （のはず）
     *
     * @return
     */
    public Vector3D getVector(){
        return mVelctor;
    }
}
